Skip to content

fix(lint): wire test layer into check:test-typecheck (#14173) - #14494

Merged
baozhoutao merged 3 commits into
mainfrom
claude/issue-14173-lint-test-typecheck
Sep 2, 2026
Merged

fix(lint): wire test layer into check:test-typecheck (#14173)#14494
baozhoutao merged 3 commits into
mainfrom
claude/issue-14173-lint-test-typecheck

Conversation

@claude

@claude claude Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Fixes #14173

What

packages/lint's typecheck script was a bare tsc --noEmit against a
tsconfig.json that excluded **/*.test.ts and **/*.spec.ts, so no gate
anywhere read a lint test file with a type checker (vitest transpiles through
esbuild, types stripped, never resolved). src/validate-expressions.test.ts
alone is ~2,700 lines built almost entirely out of compile-time and meta pins
(the #5017 receiver scan, the TRACKED_UNDECLARED_READS shrink-only list, the
residual-root table) — none of it type-checked by anything.

Wired per the triage ruling (comment 5502888897) to the mechanism #14062 (PR
#14420) landed on: scripts/check-test-typecheck.mts, per package, with a
sibling tsconfig.test.json the typecheck script NAMES.

Measurement

--listFiles on origin/main 6aea1f559 (workspace closure built first):

validate-expressions.test.ts -> 0
validate-expressions.ts      -> 1

New packages/lint/tsconfig.test.json (module semantics only — esnext /
bundler / lib: ["ES2022"] — matching how vitest actually executes these
files; strictness and rootDir untouched, inherited):

errors under BUILD semantics (NodeNext, tests included)  22  (11 TS7006 + 5 TS2835 + 6 TS6059)
errors under THIS config (test tsconfig)                  6  (6 TS6059)

The TS7006/TS2835 pile (16 errors — exactly the coverage gate's recorded
@objectstack/lint TEST_DEBT total) dissolves under bundler resolution, the
same "config tier, not the tests" effect packages/spec/packages/rest/the
packages/plugins/** family measured. The 6 residual TS6059 are
rootDir-violation errors from two test files importing example-app fixtures
outside this package (examples/app-showcase) — pre-existing, and (per the
coverage gate's own historical note on this exact entry) never this package's
debt; rootDir is inherited untouched here, so they surface rather than being
suppressed.

Authority boundary: this is a CONVERSION of the coverage gate's existing
@objectstack/lint TEST_DEBT entry (errors: 16) to per-file/per-signature
form, not a new debt-opening decision — legitimate while the measured total
stays ≤ 16. Measured: 6 ≤ 16. Within bounds.

check:type-check-coverage: GREEN with the '@objectstack/lint' TEST_DEBT
entry deleted and the #14062 graduation docblock carrying lint's line (68/78
packages type-checked, no lint exception listed). The RECONCILED rule this
gate documents ("a TEST_DEBT entry ONLY where no tsconfig the typecheck script
invokes reads the tests") is what forces the entry's removal once typecheck
names a test program — I attempted to capture the RED reading directly (entry
restored on top of the already-wired typecheck script, via a temporary git checkout HEAD --/git apply round-trip, nothing left uncommitted) but three
attempts under heavy shared-box contention each hit os-verify-lock's
queue-timeout (one holder alone held the lock 12+ minutes on an unrelated
command) without ever acquiring; I did not keep retrying past that and report
this one specific reading as NOT MEASURED rather than fabricate it. The final
GREEN state (below) is measured, and re-confirmed again after merging
origin/main (ledger re-regenerates identically: 2 files / 6 errors / 2
signatures, unchanged by the concurrent PR #14437 that also touches
packages/lint/src/**).

Not in scope

Per the file-surface constraint, no edits to packages/lint/src/** — the 6
TS6059 errors are ledgered, never fixed here.

Gates

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran RUN_RECORD_PATH
at 0a2b43d11 (post-merge, no staleness warning): 46 derived, 46 run, 0
NOT-MEASURED, 0 UNRUN.
Of those 46, three exit 3 (documented PREREQUISITE
NOT MET, not a red): check:dual-build-cjs-loads and check:type-check-debt --re-measure (both need a full pnpm build workspace closure this run never
built) and check:test-completeness (needs a saved turbo run test log CI
produces). Everything else passed. Also ran (touched scripts/**):
check:ratchet-remedy-authority, check:declared-population-live,
check-self-test-wired.mjs, check-self-test-workflow-commands.mjs,
check-type-check-coverage.mjs --self-test — all green.


Generated by Claude Code


Generated by Claude Code

…ne rule pin file is type-checked (#14173)

Onboarded by wiring to the mechanism #14062 (PR #14420) landed on, per the
triage ruling on this card (comment 5502888897): a sibling tsconfig.test.json
matching vitest's real module semantics, named by `typecheck`. Measured: 6
residual TS6059 errors over 2 files (rootDir violations from imports outside
this package, pre-existing, config-tier), recorded in the new
test-typecheck-debt.json as a CONVERSION of the coverage gate's existing
16-error TEST_DEBT entry, which is deleted as the graduation that pairing
forces.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
@github-actions github-actions Bot added the size/m label Sep 2, 2026
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 1 changed file(s) yielded no anchor (packages/lint/test-typecheck-debt.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/lint/test-typecheck-debt.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 5 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 7cbe705b03384f1bde55fd159a6a16ef6322caf2packageMentionDocs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] packages/lint has no tsc program that compiles its tests — the 2,700-line rule pin file, receiver scan included, is type-checked by nobody

2 participants